.TH FLATE 3
.SH NAME
deflateinit, deflate, deflatezlib, deflateblock, deflatezlibblock, inflateinit, inflate, inflatezlib, inflateblock, inflatezlibblock, flateerr, mkcrctab, blockcrc, adler32 \- deflate compression
.SH SYNOPSIS
.B #include <u.h>
.br
.B #include <libc.h>
.br
.B #include <flate.h>
.PP
.ta \w'\fLulongmm'u +\w'\fL  'u
.PP
.B
int	deflateinit(void)
.PP
.B
int	deflate(void *wr, int (*w)(void*,void*,int),
.br
.B
		void *rr, int (*r)(void*,void*,int),
.br
.B
		int level, int debug)
.PP
.B
int	deflatezlib(void *wr, int (*w)(void*,void*,int),
.br
.B
		void *rr, int (*r)(void*,void*,int),
.br
.B
		int level, int debug)
.PP
.B
int	deflateblock(uchar *dst, int dsize,
.br
.B
		uchar *src, int ssize,
.br
.B
		int level, int debug)
.PP
.B
int	deflatezlibblock(uchar *dst, int dsize,
.br
.B
		uchar *src, int ssize,
.br
.B
		int level, int debug)
.PP
.B
int	inflateinit(void)
.PP
.B
int	inflate(void *wr, int (*w)(void*, void*, int),
.br
.B
		void *getr, int (*get)(void*))
.PP
.B
int	inflatezlib(void *wr, int (*w)(void*, void*, int),
.br
.B
		void *getr, int (*get)(void*))
.PP
.B
int	inflateblock(uchar *dst, int dsize,
.br
.B
		uchar *src, int ssize)
.PP
.B
int	inflatezlibblock(uchar *dst, int dsize,
.br
.B
		uchar *src, int ssize)
.PP
.B
char	*flateerr(int error)
.PP
.B
ulong	*mkcrctab(ulong poly)
.PP
.B
ulong	blockcrc(ulong *tab, ulong crc, void *buf, int n)
.PP
.B
ulong	adler32(ulong adler, void *buf, int n)
.SH DESCRIPTION
These routines compress and decompress data using the deflate compression algorithm,
which is used for most gzip, zip, and zlib files.
.PP
.I Deflate
compresses input data retrieved by calls to
.I r
with arguments
.IR rr ,
an input buffer, and a count of bytes to read.
.I R
should return the number of bytes read;
end of input is signaled by returning zero, an input error by
returning a negative number.
The compressed output is written to
.I w
with arguments
.IR wr ,
the output data, and the number of bytes to write.
.I W
should return the number of bytes written;
writing fewer than the requested number of bytes is an error.
.I Level
indicates the amount of computation deflate should do while compressing the data.
Higher
.I levels
usually take more time and produce smaller outputs.
Valid values are 1 to 9, inclusive; 6 is a good compromise.
If
.I debug
is non-zero, cryptic debugging information is produced on standard error.
.PP
.I Inflate
reverses the process, converting compressed data into uncompressed output.
Input is retrieved one byte at a time by calling
.I get
with the argument
.IR getr .
End of input of signaled by returning a negative value.
The uncompressed output is written to
.IR w ,
which has the same interface as for
.IR deflate .
.PP
.I
Deflateblock
and
.I inflateblock
operate on blocks of memory but are otherwise similar to
.I deflate
and
.IR inflate .
.PP
The zlib functions are similar, but operate on files with a zlib header and trailer.
.PP
.I Deflateinit
or
.I inflateinit
must be called once before any call to the corresponding routines.
.PP
If the above routines fail,
they return a negative number indicating the problem.
The possible values are
.IR FlateNoMem ,
.IR FlateInputFail ,
.IR FlateOutputFail ,
.IR FlateCorrupted ,
and 
.IR FlateInternal .
.I Flateerr
converts the number into a printable message.
.I FlateOk
is defined to be zero,
the successful return value for
.IR deflateinit ,
.IR deflate ,
.IR deflatezlib ,
.IR inflateinit ,
.IR inflate ,
and 
.IR inflatezlib .
The block functions return the number of bytes produced when they succeed.
.PP
.I Mkcrctab
allocates
(using
.IR malloc (3)),
initializes, and returns a table for rapid computation of 32 bit CRC values using the polynomial
.IR poly .
.I Blockcrc
uses
.IR tab ,
a table returned by
.IR mkcrctab ,
to update
.I crc
for the
.I n
bytes of data in
.IR buf ,
and returns the new value.
.I Crc
should initially be zero.
.I Blockcrc
pre-conditions and post-conditions
.I crc
by ones complementation.
.PP
.I Adler32
updates the Adler 32-bit checksum of the
.I n
butes of data in
.IR buf.
The initial value of
.I adler
(that is, its value after seeing zero bytes) should be 1.
.SH SOURCE
.B \*9/src/libflate
